<?php

namespace app\common\validate;

use think\Validate;

/**
 * 通用基础验证器（封装可复用的字符串验证规则）
 */
class BaseValidate extends Validate
{
    /**
     * 自定义验证：混合字符串（汉字+字母+数字）
     * @param string $value 待验证的字符串值
     * @param array $rule 额外规则（支持 min/max 控制长度，默认 min=1, max=255）
     * @param array $data 所有表单数据（可选，未使用）
     * @return bool|string 验证通过返回true，失败返回错误信息
     */
    protected function checkMixedString($value, $rule = [], $data = [])
    {
        // 1. 合并默认规则与自定义规则（允许覆盖默认长度）
        $defaultRule = ['min' => 1, 'max' => 255];
        $mergedRule = array_merge($defaultRule, $rule);

        // 2. 验证字符类型：仅允许汉字、字母、数字（正则含u修饰符，支持Unicode汉字）
        $charPattern = '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u';
        if (!preg_match($charPattern, $value)) {
            return '只能包含汉字、字母和数字，不允许其他字符';
        }

        // 3. 验证字符串长度（使用mb_strlen处理多字节字符，如汉字）
        $strLength = mb_strlen($value, 'utf-8');
        if ($strLength < $mergedRule['min'] || $strLength > $mergedRule['max']) {
            return "字符串长度需在 {$mergedRule['min']} 到 {$mergedRule['max']} 之间";
        }

        // 4. 所有验证通过
        return true;
    }

    /**
     * 自定义手机号验证规则
     * @param string $value 待验证的手机号值
     * @param string $rule  当前规则（这里未使用，可留空或忽略）
     * @param array  $data  所有表单数据（可选，按需使用）
     * @return bool|string 验证通过返回true，失败返回错误信息
     */
    protected function checkMobile($value, $rule, $data)
    {
        // 正则表达式：匹配中国大陆手机号（11位，1开头，第二位3-9）
        $pattern = '/^1[3-9]\d{9}$/';

        if (preg_match($pattern, $value)) {
            return true; // 验证通过
        } else {
            return '手机号格式错误'; // 验证失败，返回错误信息（与$message中的提示一致或自定义）
            // 或直接返回字符串：'手机号必须是11位有效号码（以13-19开头）'
        }
    }
}
